/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKControlDrawback;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_VENTA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioControlDrawback;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.ControlDrawback;
import pe.com.cotelasa.scp.entidad.DetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.PartidaDespacho;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBControlDrawback")
@Scope("request")
public class MBControlDrawback extends MBGenerico implements IMantenedor, Serializable {

    private static Logger logger = Logger.getLogger(MBControlDrawback.class);
    @Inject
    private BKControlDrawback bk;
    @Inject
    private IServicioControlDrawback servicio;
    @Inject
    private IServicioVentaFacturacion servicioFactura;
    @Autowired
    BKSession session;

    public String mostrar() {
        String URL = "";
        try {
            bk.setControlFormulario(servicio.buscarPorCodVenta(bk.getFacturaSeleccionada().getCoddocventa()));
            if (bk.getControlFormulario() == null) {
                URL = nuevo();
            } else {
                URL = editar();
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URL;

    }

    @Override
    public String nuevo() {
        bk.setComando(new ComandoGuardar(this));

        bk.setControlFormulario(new ControlDrawback());
        bk.getControlFormulario().setFechaCobranza(new Date());
        bk.getControlFormulario().setFecCreacion(new Date());
        bk.getControlFormulario().setUsrCreacion(session.getUsuario().getUsuario());
        bk.setEstadoControl(new ArrayList<String>());
        for (Enum e : ControlDrawback.ESTADO_CONTROL.values()) {
            bk.getEstadoControl().add(e.name());
        }

        return URLPaginacion.Ventas.URL_FORMULARIO_CONTROL_DRAWBACK;
    }

    @Override
    public String editar() {
        //OrdenCompraServicio.ESTADO_ORDEN_SC.
        bk.setComando(new ComandoActualizar(this));
        bk.setEstadoControl(new ArrayList<String>());
        for (Enum e : ControlDrawback.ESTADO_CONTROL.values()) {
            bk.getEstadoControl().add(e.name());
        }
        return URLPaginacion.Ventas.URL_FORMULARIO_CONTROL_DRAWBACK;
    }

    @Override
    public String guardar() {
        try {
            bk.getControlFormulario().setVentaFacturacion(bk.getFacturaSeleccionada());
            bk.getControlFormulario().setFecCreacion(new Date());
            bk.getControlFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            ResultadoServicio rs = servicio.guardarControlDrawback(bk.getControlFormulario());

            mostrarMensaje(rs.getMensaje());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }

        return editar();
    }

    @Override
    public String actualizar() {
        try {

            bk.getControlFormulario().setFecModificacion(new Date());
            bk.getControlFormulario().setUsrModificacion(session.getUsuario().getUsuario());
            ResultadoServicio rs = servicio.actualizarControlDrawback(bk.getControlFormulario());

            mostrarMensaje(rs.getMensaje());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return editar();
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String ver() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        return URLPaginacion.Ventas.URL_LISTA_FACTURA_EXPORTACION;
    }

    public void calcular() {
        bk.getControlFormulario().setMonto(
                bk.getFacturaSeleccionada().getPrecioVenta()
                * bk.getControlFormulario().getPorcentaje() / 100);
        System.out.println("precio venta: " + bk.getFacturaSeleccionada().getPrecioVenta());
        System.out.println("porcentaje: " + bk.getControlFormulario().getPorcentaje());
        System.out.println("monto: " + bk.getControlFormulario().getMonto());
    }

    public void reporteExportacion() throws IOException, ServiceException {
        List<VentaFacturacion> lista = new ArrayList<VentaFacturacion>();
        bk.getFacturaBusqueda().setTipoCompago(TIPO_DOC_VENTA.FACTURA_EXPORTACION.getValor());
        try {
            lista = servicioFactura.obtenerFacturasExportacionReporte(bk.getFacturaBusqueda());
        } catch (ServiceException e) {
            e.printStackTrace();
        }

        HSSFWorkbook wb = new HSSFWorkbook();

        HSSFSheet sheet = wb.createSheet("General");

        sheet.setAutobreaks(true);
        sheet.setDefaultColumnWidth(10);
        sheet.setAlternativeFormula(true);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle borderDotStyle = wb.createCellStyle();
        borderDotStyle.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderRight(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderTop(HSSFCellStyle.BORDER_DOTTED);

        /**
         * ***** fuente para titulo ******************
         */
        HSSFFont titFont = wb.createFont();
        titFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        titFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle titStyle = wb.createCellStyle();
        titStyle.setFont(titFont);
        titStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        /**
         * ***** fuente para cabecera ******************
         */
        HSSFFont cabFont = wb.createFont();
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.cloneStyleFrom(borderStyle);
        cabStyle.setWrapText(true);
        cabStyle.setFont(cabFont);

        /**
         * ***** fuente normal ******************
         */
        HSSFFont genFont = wb.createFont();
        genFont.setFontHeightInPoints(Short.valueOf("7"));


        HSSFCellStyle genStyleL = wb.createCellStyle();
        genStyleL.cloneStyleFrom(borderDotStyle);
        genStyleL.setFont(genFont);
        genStyleL.setWrapText(true);

        HSSFCellStyle genStyleN = wb.createCellStyle();
        genStyleN.cloneStyleFrom(borderDotStyle);
        genStyleN.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        genStyleN.setFont(genFont);

        /**
         * ***** fuente para resultado ******************
         */
        HSSFFont resFont = wb.createFont();
        resFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        resFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle resStyleL = wb.createCellStyle();

        resStyleL.cloneStyleFrom(borderDotStyle);
        resStyleL.setFillForegroundColor(HSSFColor.YELLOW.index);
        resStyleL.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        resStyleL.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        resStyleL.setFont(resFont);

        HSSFCellStyle resStyleN = wb.createCellStyle();

        resStyleN.cloneStyleFrom(borderDotStyle);
        resStyleN.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        resStyleN.setFillForegroundColor(HSSFColor.YELLOW.index);
        resStyleN.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        resStyleN.setFont(resFont);

        HSSFRow row = sheet.createRow(1);

        HSSFCell cell = row.createCell(0);

        cell.setCellStyle(titStyle);
        cell.setCellValue("REPORTE EXPORTACIONES " + session.getEmpresa().getNombreComercial() + " - PERIODO " + UtilitarioFecha.obtenerAnio(bk.getFacturaBusqueda().getFechDocventa()));
        CellRangeAddress region = new CellRangeAddress(1, 1, 0, 14);
        sheet.addMergedRegion(region);

        int rowCont = 3;
        if (bk.getFacturaBusqueda().getOrdenPedido().getTipoOp() != '0') {
            row = sheet.createRow(rowCont);
            titFont.setFontHeightInPoints(Short.valueOf("8"));
            cell = row.createCell(0);
            cell.setCellStyle(titStyle);
            cell.setCellValue(bk.getFacturaBusqueda().getOrdenPedido().getTipoOp() == 'T' ? "TELA" : "PRENDA");

            region = new CellRangeAddress(rowCont, rowCont, 0, 14);
            sheet.addMergedRegion(region);

            rowCont += 2;
        }

        row = sheet.createRow(rowCont);
        row = armarCabecera(row, cabStyle);

        rowCont++;
        double valorFob = 0;
        double monto = 0;
        double montoCobrado = 0;
        Date fecha = new Date();
        for (VentaFacturacion venta : lista) {

            if (UtilitarioFecha.obtenerMes(fecha) != UtilitarioFecha.obtenerMes(venta.getFechDocventa()) && !venta.equals(lista.get(0))) {
                row = sheet.createRow(rowCont);
                cell = row.createCell(0);
                cell.setCellStyle(resStyleL);
                cell.setCellValue(UtilitarioFecha.formatearFecha(fecha, "MMMM - yyyy").toUpperCase());

                region = new CellRangeAddress(rowCont, rowCont, 0, 5);
                RegionUtil.setBorderBottom(CellStyle.BORDER_DOTTED, region, sheet, wb);
                RegionUtil.setBorderTop(CellStyle.BORDER_DOTTED, region, sheet, wb);

                sheet.addMergedRegion(region);

                cell = row.createCell(6);
                cell.setCellStyle(resStyleN);
                cell.setCellValue(valorFob);

                cell = row.createCell(7);
                cell.setCellStyle(resStyleL);
                cell.setCellValue("");

                region = new CellRangeAddress(rowCont, rowCont, 7, 9);
                RegionUtil.setBorderBottom(CellStyle.BORDER_DOTTED, region, sheet, wb);
                RegionUtil.setBorderTop(CellStyle.BORDER_DOTTED, region, sheet, wb);
                sheet.addMergedRegion(region);

                cell = row.createCell(10);
                cell.setCellStyle(resStyleN);
                cell.setCellValue(monto);

                cell = row.createCell(11);
                cell.setCellStyle(resStyleL);
                cell.setCellValue("");

                region = new CellRangeAddress(rowCont, rowCont, 11, 12);
                RegionUtil.setBorderBottom(CellStyle.BORDER_DOTTED, region, sheet, wb);
                RegionUtil.setBorderTop(CellStyle.BORDER_DOTTED, region, sheet, wb);
                sheet.addMergedRegion(region);

                cell = row.createCell(13);
                cell.setCellStyle(resStyleN);
                cell.setCellValue(montoCobrado);

                cell = row.createCell(14);
                cell.setCellStyle(resStyleL);
                cell.setCellValue("");

                valorFob = 0;
                monto = 0;
                montoCobrado = 0;

                rowCont++;
            }

            ControlDrawback control = new ControlDrawback();
            try {
                control = servicio.buscarPorCodVenta(venta.getCoddocventa());
            } catch (ServiceException e) {
                e.printStackTrace();
            }
            row = sheet.createRow(rowCont);
            row = armarContenido(row, genStyleL, genStyleN, venta, control);
            valorFob += venta.getPrecioVenta();
            if (control != null) {
                monto += control.getMonto();
                if (control.getMontoCobrado() != null) {
                    montoCobrado += control.getMontoCobrado();
                }
            }


            rowCont++;

        }
        row = sheet.createRow(rowCont);
        cell = row.createCell(0);
        cell.setCellStyle(resStyleL);
        cell.setCellValue(UtilitarioFecha.formatearFecha(fecha, "MMMM - yyyy").toUpperCase());

        region = new CellRangeAddress(rowCont, rowCont, 0, 5);
        RegionUtil.setBorderBottom(CellStyle.BORDER_DOTTED, region, sheet, wb);
        RegionUtil.setBorderTop(CellStyle.BORDER_DOTTED, region, sheet, wb);

        sheet.addMergedRegion(region);

        cell = row.createCell(6);
        cell.setCellStyle(resStyleN);
        cell.setCellValue(valorFob);

        cell = row.createCell(7);
        cell.setCellStyle(resStyleL);
        cell.setCellValue("");

        region = new CellRangeAddress(rowCont, rowCont, 7, 9);
        RegionUtil.setBorderBottom(CellStyle.BORDER_DOTTED, region, sheet, wb);
        RegionUtil.setBorderTop(CellStyle.BORDER_DOTTED, region, sheet, wb);

        sheet.addMergedRegion(region);

        cell = row.createCell(10);
        cell.setCellStyle(resStyleN);
        cell.setCellValue(monto);

        cell = row.createCell(11);
        cell.setCellStyle(resStyleL);
        cell.setCellValue("");

        region = new CellRangeAddress(rowCont, rowCont, 11, 12);
        RegionUtil.setBorderBottom(CellStyle.BORDER_DOTTED, region, sheet, wb);
        RegionUtil.setBorderTop(CellStyle.BORDER_DOTTED, region, sheet, wb);
        sheet.addMergedRegion(region);

        cell = row.createCell(13);
        cell.setCellStyle(resStyleN);
        cell.setCellValue(montoCobrado);

        cell = row.createCell(14);
        cell.setCellStyle(resStyleL);
        cell.setCellValue("");

        valorFob = 0;
        monto = 0;
        montoCobrado = 0;

        rowCont++;

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"Reporte de Exportaciones.xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();

    }

    public HSSFRow armarCabecera(HSSFRow row, HSSFCellStyle titStyle) {

        HSSFCell cell = row.createCell(0);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FECHA");

        cell = row.createCell(1);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FACTURA Nº");

        cell = row.createCell(2);
        cell.setCellStyle(titStyle);
        cell.setCellValue("CLIENTE");

        cell = row.createCell(3);
        cell.setCellStyle(titStyle);
        cell.setCellValue("PAIS");

        cell = row.createCell(4);
        cell.setCellStyle(titStyle);
        cell.setCellValue("PRODUCTO");

        cell = row.createCell(5);
        cell.setCellStyle(titStyle);
        cell.setCellValue("ORDEN PEDIDO");

        cell = row.createCell(6);
        cell.setCellStyle(titStyle);
        cell.setCellValue("VALOR FOB");

        cell = row.createCell(7);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FLETE Y SEGURO");

        cell = row.createCell(8);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FECHA EMBARQUE");

        cell = row.createCell(9);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FECHA LLEGADA");

        cell = row.createCell(10);
        cell.setCellStyle(titStyle);
        cell.setCellValue("DRAWBACK");

        cell = row.createCell(11);
        cell.setCellStyle(titStyle);
        cell.setCellValue("STATUS");

        cell = row.createCell(12);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FECHA DE COBRANZA");

        cell = row.createCell(13);
        cell.setCellStyle(titStyle);
        cell.setCellValue("IMPORTE COBRADO");

        cell = row.createCell(14);
        cell.setCellStyle(titStyle);
        cell.setCellValue("Nº EXPEDIENTE");

        return row;
    }

    public HSSFRow armarContenido(HSSFRow row, HSSFCellStyle titStyle, HSSFCellStyle genNStyle, VentaFacturacion venta, ControlDrawback control) {

        HSSFCell cell = row.createCell(0);
        cell.setCellStyle(titStyle);
        cell.setCellValue(UtilitarioFecha.formatearFecha(venta.getFechDocventa(), "dd/MM/yyyy"));

        cell = row.createCell(1);
        cell.setCellStyle(titStyle);
        cell.setCellValue(venta.getSerieFactura() + "-" + venta.getNumFactura());

        cell = row.createCell(2);
        cell.setCellStyle(titStyle);
        cell.setCellValue(venta.getRazon());

        cell = row.createCell(3);
        cell.setCellStyle(titStyle);
        cell.setCellValue(venta.getCodCliente().getIdUbigeo().getIdPais().getNombre());

        cell = row.createCell(4);
        cell.setCellStyle(titStyle);
        cell.setCellValue(venta.getOrdenPedido().getTipoOp() == 'T' ? "TELA" : "PRENDA");

        cell = row.createCell(5);
        cell.setCellStyle(titStyle);
        cell.setCellValue(venta.getOrdenPedido().getCodigoOrdenPedido());

        cell = row.createCell(6);
        cell.setCellStyle(genNStyle);
        cell.setCellValue(venta.getPrecioVenta());

        cell = row.createCell(7);
        cell.setCellStyle(titStyle);
        cell.setCellValue(venta.getValorCFR() + venta.getValorCIF());

        cell = row.createCell(8);
        cell.setCellStyle(titStyle);
        if (venta.getFechEmbarque() != null) {
            cell.setCellValue(UtilitarioFecha.formatearFecha(venta.getFechEmbarque(), "dd/MM/yyyy"));
        } else {
            cell.setCellValue("");
        }

        cell = row.createCell(9);
        cell.setCellStyle(titStyle);
        if (venta.getFechLlegada() != null) {
            cell.setCellValue(UtilitarioFecha.formatearFecha(venta.getFechLlegada(), "dd/MM/yyy"));
        } else {
            cell.setCellValue("");
        }

        if (control != null) {
            cell = row.createCell(10);
            cell.setCellStyle(genNStyle);
            cell.setCellValue(control.getMonto());

            cell = row.createCell(11);
            cell.setCellStyle(titStyle);
            cell.setCellValue(control.getEstadoControl() == ControlDrawback.ESTADO_CONTROL.COBRADO.getValor() ? ControlDrawback.ESTADO_CONTROL.COBRADO.name() 
                    : control.getEstadoControl() == ControlDrawback.ESTADO_CONTROL.PRESENTADO.getValor()?ControlDrawback.ESTADO_CONTROL.PRESENTADO.name()
                    :ControlDrawback.ESTADO_CONTROL.RECHAZADO.name());

            cell = row.createCell(12);
            cell.setCellStyle(titStyle);
            if (control.getFechaCobranza() != null) {
                cell.setCellValue(UtilitarioFecha.formatearFecha(control.getFechaCobranza(), "dd/MM/yyyy"));
            } else {
                cell.setCellValue("");
            }

            cell = row.createCell(13);
            cell.setCellStyle(genNStyle);
            cell.setCellValue(control.getMontoCobrado());

            cell = row.createCell(14);
            cell.setCellStyle(titStyle);
            cell.setCellValue(control.getNroExpediendte());


        } else if (venta.getAplicarDrawback() == 1) {
            cell = row.createCell(11);
            cell.setCellStyle(titStyle);
            cell.setCellValue("POR PRESENTAR");
        }

        return row;
    }
}
